<?php
declare(strict_types=1);
namespace app\common\model;
use \think\facade\Db;

class Debug extends Base
{
	/**
	 * 模型初始化
	 */
	protected static function init()
	{

	}


	/**
	 * 模型事件 - 新增前执行
	 * @param Object $obj 当前模型的对象实例
	 */
	public static function onBeforeInsert(object $obj)
	{
		// 获取表后缀
		$table_suffix = (int) ltrim($obj->suffix, '_');

		// 自动建表
		$auto_create_table = self::autoCreateTable($table_suffix);
		if($auto_create_table === false)
		{
			abort(500, '自动创建调试日志表失败');
		}
	}


	/**
	 * 自动建表
	 * @param Int $table_suffix 表后缀（年份）
	 */
	static private function autoCreateTable(int $table_suffix) : bool
	{
		// 计算完整的表名
		$table_name = (new static())->getTable() . "_{$table_suffix}";

		// 以下个月第一天的起始时间戳为分区条件，生成分区语句
		$partition_list = [];
		for($month=1; $month<=12; $month++)
		{
			$partition_range = strtotime("{$table_suffix}-{$month}-1 +1month");
			$partition_name = $table_suffix . str_pad((string)$month, 2, '0', STR_PAD_LEFT);
			$partition_list[] = "PARTITION p{$partition_name} VALUES LESS THAN ({$partition_range})";
		}
		$partition_sql = implode(',', $partition_list);

		// 自动建表语句
		$auto_build_sql = "CREATE TABLE IF NOT EXISTS `{$table_name}` (
			`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID，自增',
			`date` datetime NOT NULL COMMENT '时间（YYYY-MM-DD HH:MM:SS）',
			`ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'ip地址（兼容IPv6）',
			`url` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '请求地址（URL）',
			`path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件路径',
			`line` int unsigned NOT NULL COMMENT '所在行数',
			`request_data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '完整请求数据（JSON）',
			`get_data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'GET数据（JSON）',
			`post_data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'POST数据（JSON）',
			`custom_data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '自定义数据（JSON）',
			`create_time` int unsigned NOT NULL COMMENT '添加时间',
			`update_time` int unsigned DEFAULT NULL COMMENT '更新时间',
			`delete_time` int unsigned DEFAULT NULL COMMENT '删除时间',
			`usable` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '是否可用 [0-否 1-是]',
			PRIMARY KEY (`id`,`create_time`) USING BTREE
		) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='调试日志表{$table_suffix}'
		PARTITION BY RANGE (`create_time`) ({$partition_sql});";
		// 执行原生SQL
		$res = Db::execute($auto_build_sql);

		return ($res===false) ? false : true;
	}


}
